/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package session;

import entities.CompteBancaire;
import entities.CompteBancaireEpargne;
import entities.CompteBancaireJoint;
import entities.OperationBancaire;
import entities.Utilisateur;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import javax.ejb.Stateless;
import javax.ejb.LocalBean;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

/**
 *
 * @author Lionel Prado
 */
@Stateless
@LocalBean
public class GestionnaireDeCompteBancaire {
    @PersistenceContext(unitName = "Tp3BanqueLionel-ejbPU")
    private EntityManager em;
    
    
      
    public void creerCompteBancaireCourant(Utilisateur user, float solde) {  
        
        CompteBancaire c = new CompteBancaire(solde);
       
        OperationBancaire op = new OperationBancaire("Création du compte courant", solde);  
        c.addOperation(op); // ici on ajoute la relation  
//        em.persist(op);
        
        // add cb ds user et cb ds cet user
        user.addAccount(c);
        em.persist(c);
         
    } 
    
    public void creerCompteBancaireEpargne(Utilisateur user, float solde, float taux) {  
        
        CompteBancaireEpargne cbe = new CompteBancaireEpargne(solde, taux);
    
        OperationBancaire op = new OperationBancaire("Création du compte épargne au taux de : " + taux + "%", solde);  
        cbe.addOperation(op);
//        em.persist(op);
        
        // add cb ds user et cb ds cet user
        user.addAccount(cbe);
        em.persist(cbe);

    } 
    
    public void creerCompteJoint(Utilisateur user, float solde, Utilisateur user2) {  
        
        CompteBancaireJoint cbj = new CompteBancaireJoint(solde);
        
        OperationBancaire op = new OperationBancaire("Création du compte joint [ " + user.getLogin() + " & "+ user2.getLogin() + " ]" , solde);  
        cbj.addOperation(op);
        
        // add cb ds user et cb ds cet user
        user.addAccountJoint(cbj);
        user2.addAccountJoint2(cbj);
        em.persist(cbj);

        System.out.print("////////////////////ON EST DANS GESTIONNAIRE FIN DU PERSIST DE JOINT////////////////////////////////////");
    } 
    
    public void creerComptesTest() {  
        
        //creation de 4 users et d'un compte pour chacun
        
        Utilisateur u1 = new Utilisateur("John", "Lennon", "JL", "JL", true);  
        Utilisateur u2 = new Utilisateur("Paul", "Cartney", "PC", "PC", true); 
        Utilisateur u3 = new Utilisateur("Ringo", "Starr", "RS", "RS", true); 
        Utilisateur u4 = new Utilisateur("Georges", "Harrisson", "GH", "GH", true); 
        Utilisateur u5 = new Utilisateur("admin", "admin", "a", "a", true);
        Utilisateur u6 = new Utilisateur("user", "user", "u", "u", false);
        
        
        em.persist(u1);
        em.persist(u2);
        em.persist(u3);
        em.persist(u4);
        em.persist(u5);
        em.persist(u6);
        
        creerCompteBancaireCourant(u1, 150000);  
        creerCompteBancaireCourant(u2, 950000);          
        creerCompteBancaireEpargne(u3, 20000, 10);  
        creerCompteJoint(u4, 100000, u2);  
     }
    
    public Collection<CompteBancaire> getAllComptes() {
        Query query = em.createNamedQuery("CompteBancaire.findAll");  
        return query.getResultList();  
    }
    
    public Collection<CompteBancaireEpargne> getAllComptesEpargnes() {
        Query query = em.createNamedQuery("CompteBancaireEpargne.findAll");  
        return query.getResultList();  
    }
    
    public Collection<CompteBancaire> getAllComptesByUser(Utilisateur user) {
            
        Collection<CompteBancaire> listeCBUser;
        Collection<CompteBancaire> listeCBUser2;
        
        Query query = em.createNamedQuery("CompteBancaire.findCompteByUser");  
        query.setParameter("user", user);
        
        listeCBUser = query.getResultList();  
        
        query = em.createNamedQuery("CompteBancaire.findCompteJointByUser");  
        query.setParameter("user", user);
        
        listeCBUser2 = query.getResultList();  
        
        listeCBUser.addAll(listeCBUser2);  
        
        return listeCBUser; 
    }
    
    public Collection<CompteBancaire> getAllComptesDiffCbCourant(Utilisateur user) {
        Query query = em.createNamedQuery("CompteBancaire.findAllDifferentCbCourant"); 
        query.setParameter("user", user);

        return query.getResultList();  
    }
    
    public Collection<CompteBancaire> getAllComptesCbUser(long idPass, Utilisateur user) {
        Query query = em.createNamedQuery("CompteBancaire.findCompteByUserDiffCompte"); 
        query.setParameter("user", user);
        query.setParameter("idPass", idPass);

        return query.getResultList();  
    }
    
    public CompteBancaire getCompte(Long id) {  
        return em.find(CompteBancaire.class, id);
    }  
    
    
    public List<CompteBancaire> getComptes(int start, int nombreDeComptes){
        return null;
    }
    
    public void incrementerSoldeCompteEpargne(){
        
        System.out.println("Start methode");
        
        //appeler incrementer tous les comptes epargnes
        Collection<CompteBancaireEpargne> liste = getAllComptesEpargnes();
        
        //si liste non nulle :
        if(!liste.isEmpty()){
            
            Iterator iterator = liste.iterator();

            while (iterator.hasNext()) {
                
                CompteBancaireEpargne cbe = (CompteBancaireEpargne)iterator.next();
                
                System.out.println("before : cbe.solde : " + cbe.getSoldeCompte());
                
                if(cbe.getSoldeCompte() > 0){
                    System.out.println("supp 0");
                    cbe.setSoldeCompte(cbe.getSoldeCompte() * ( (cbe.getTaux()/100) +1));
                    em.merge(cbe);
                }
                
                System.out.println("after : cbe.solde : " + cbe.getSoldeCompte());
                
                
            }                 
        }       
    }

    public CompteBancaire update(CompteBancaire compteBancaire) {

        System.out.println("cette fois on est ds gestionnaire..." + compteBancaire.getId() + compteBancaire.getProprietaireCompte().getNomProprietaire()); 
        return em.merge(compteBancaire);  
    }
    
    public void delete(CompteBancaire compteBancaire) {
        em.remove(em.find(CompteBancaire.class, compteBancaire.getId()));
    }
        
    public void persist(Object object) {
        em.persist(object);
    }
   
}